package com.caocaog.market.util;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

/**
 * 美团签名计算工具类
 */
public class SignHelper {


    /**
     * 双方来加密使用的密钥
     */
    public static final String SECRET_DEV = "%,t21cFuz=g5>5c7;32tH]3{n(m{Z~)GY)Ispt|5Nv^J+jdkhm6DQ3y7SGv@g4U9";
    public static final String SECRET_PROD = "LSeyT9{38=:5,?P~E~(5T?a-($aS)`9W.2MsEi]Wl-h]DCFVQO?5yb`&{EGsZuMp";


    /**
     * 加密方法入口
     *
     * @param params 传来的参数
     * @return 加密后的Sing值
     * @throws NoSuchAlgorithmException 抛出异常
     */
    public static String generateSign(Map<String, ?> params) throws NoSuchAlgorithmException {
        String encodeString = getEncodeString(params, SECRET_PROD);
        System.out.println("encodeString:" + encodeString);
        return generateSign(encodeString);
    }

    /**
     * 获得加密后的字符串Sing
     *
     * @param params 加密参数
     * @param secret 密钥信息
     * @return 加密后的结果Sing
     */
    private static String getEncodeString(Map<String, ?> params, String secret) {
        Iterator<String> keyIter = params.keySet().iterator();
        Set<String> sortedParams = new TreeSet<>();
        while (keyIter.hasNext()) {
            sortedParams.add(keyIter.next());
        }

        StringBuilder strB = new StringBuilder(secret);

        // 排除sign和空值参数
        for (String key : sortedParams) {
            if (key.equals("sign")) {
                continue;
            }

            String value = String.valueOf(params.get(key));

            if (value != null && !"".equals(value)) {
                strB.append(key).append(value);
            }
        }
        return strB.toString();
    }

    /**
     * sha1加密
     * @param content 被加密的密文
     * @return 加密结果
     * @throws NoSuchAlgorithmException 抛出异常
     */
    public static String generateSign(String content) throws NoSuchAlgorithmException {
        return sha1(content);
    }

//    public static void main(String[] args) throws NoSuchAlgorithmException {
//        System.out.println(sha1("secret"+"test123456" + "appkey" + "test" + "timestamp" + "1700549851").toLowerCase());
//    }

    /**
     * SHA1 加密
     *
     * @param s 待加密的字符串
     */
    private static String sha1(String s) throws NoSuchAlgorithmException {
        char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
        byte[] btInput = s.getBytes(StandardCharsets.UTF_8);
        // 获得MD5摘要算法的 MessageDigest 对象
        MessageDigest mdInst = MessageDigest.getInstance("sha-1");
        // 使用指定的字节更新摘要
        mdInst.update(btInput);
        // 获得密文
        byte[] md = mdInst.digest();
        // 把密文转换成十六进制的字符串形式
        int j = md.length;
        char[] str = new char[j * 2];
        int k = 0;
        for (byte byte0 : md) {
            str[k++] = hexDigits[byte0 >>> 4 & 0xf];
            str[k++] = hexDigits[byte0 & 0xf];
        }
        return new String(str).toLowerCase();
    }


}
